import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取视频文件
cap=cv.VideoCapture('bike.mp4')

#循环播放视频
while cap.isOpened():
    #逐帧读取

    

    ret,frame=cap.read()
    if not ret:
        print("haven't read the frame")
        break
    #转换为灰度图
    gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
    #获取傅里叶系数
    fCoef=np.fft.fft2(gray)
    
    #放大傅里叶系数获得振幅谱
    amp_list=20*np.log(np.abs(fCoef))

    #d对振幅谱进行排序
    amp_list_sorted=np.sort(amp_list.ravel())

    
    
    #计算压缩0.5倍和0.05倍的阈值
    thresh_1=amp_list_sorted[int((1-0.5)*gray.size)]
    thresh_2=amp_list_sorted[int((1-0.05)*gray.size)]

    #创建掩膜，保留振幅大于阈值的频率分量
    mask1=amp_list>thresh_1
    mask2=amp_list>thresh_2

    #使用压缩后的傅里叶系数进行逆傅里叶变换，得到压缩后的图像
    fCoef_compressed1=fCoef*mask1
    fCoef_compressed2=fCoef*mask2

    img_cp1=np.fft.ifft2(fCoef_compressed1).real
    img_cp2=np.fft.ifft2(fCoef_compressed2).real
    
    #将图像的值域归一化到0-255
    img_cp1 = cv.normalize(img_cp1, None, 0, 255, cv.NORM_MINMAX, cv.CV_8U)
    img_cp2= cv.normalize(img_cp2, None, 0, 255, cv.NORM_MINMAX, cv.CV_8U)

    cv.imshow('frame',gray)
    cv.imshow("img_cp_0.5",img_cp1)
    cv.imshow("img_cp_0.05",img_cp2)

    #每隔1ms检查一次用户输入，如果按下'q'则退出循环
    if cv.waitKey(1)==ord('q'):
        break
cap.release()
cv.destroyAllWindows()


